{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ebd66700",
   "metadata": {},
   "source": [
    "## Demo_Activation (NA)\n",
    "This is a demo for visualizing the Neuronal Activation (NA) of a Neuron Network\n",
    "\n",
    "To run this demo from scratch, you need first generate a BadNet attack result by using the following cell"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b950f4fc",
   "metadata": {},
   "outputs": [],
   "source": [
    "! python ../../attack/badnet.py --save_folder_name badnet_demo"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f81f973",
   "metadata": {},
   "source": [
    "or run the following command in your terminal\n",
    "\n",
    "```python attack/badnet.py --save_folder_name badnet_demo```"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "87bd9f5a",
   "metadata": {},
   "source": [
    "### Step 1: Import modules and set arguments"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "71b7087b",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sys, os\n",
    "import yaml\n",
    "import torch\n",
    "import numpy as np\n",
    "import torchvision.transforms as transforms\n",
    "\n",
    "sys.path.append(\"../\")\n",
    "sys.path.append(\"../../\")\n",
    "sys.path.append(os.getcwd())\n",
    "from visual_utils import *\n",
    "from utils.aggregate_block.dataset_and_transform_generate import (\n",
    "    get_transform,\n",
    "    get_dataset_denormalization,\n",
    ")\n",
    "from utils.aggregate_block.fix_random import fix_random\n",
    "from utils.aggregate_block.model_trainer_generate import generate_cls_model\n",
    "from utils.save_load_attack import load_attack_result\n",
    "from utils.defense_utils.dbd.model.utils import (\n",
    "    get_network_dbd,\n",
    "    load_state,\n",
    "    get_criterion,\n",
    "    get_optimizer,\n",
    "    get_scheduler,\n",
    ")\n",
    "from utils.defense_utils.dbd.model.model import SelfModel, LinearModel\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "2fb719c7",
   "metadata": {},
   "outputs": [],
   "source": [
    "### Basic setting: args\n",
    "args = get_args(True)\n",
    "\n",
    "########## For Demo Only ##########\n",
    "args.yaml_path = \"../../\"+args.yaml_path\n",
    "args.result_file_attack = \"badnet_demo\"\n",
    "######## End For Demo Only ##########\n",
    "\n",
    "with open(args.yaml_path, \"r\") as stream:\n",
    "    config = yaml.safe_load(stream)\n",
    "config.update({k: v for k, v in args.__dict__.items() if v is not None})\n",
    "args.__dict__ = config\n",
    "args = preprocess_args(args)\n",
    "fix_random(int(args.random_seed))\n",
    "\n",
    "save_path_attack = \"../..//record/\" + args.result_file_attack\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f959b510",
   "metadata": {},
   "source": [
    "### Step 2: Load data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "b8b67ac9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "WARNING:root:save_path MUST have 'record' in its abspath, and data_path in attack result MUST have 'data' in its path\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Files already downloaded and verified\n",
      "Files already downloaded and verified\n",
      "loading...\n",
      "max_num_samples is given, use sample number limit now.\n",
      "subset bd dataset with length:  5000\n",
      "Create visualization dataset with \n",
      " \t Dataset: bd_train \n",
      " \t Number of samples: 5000  \n",
      " \t Selected classes: [0 1 2 3 4 5 6 7 8 9]\n"
     ]
    }
   ],
   "source": [
    "# Load result\n",
    "result_attack = load_attack_result(save_path_attack + \"/attack_result.pt\")\n",
    "selected_classes = np.arange(args.num_classes)\n",
    "\n",
    "# Select classes to visualize\n",
    "if args.num_classes>args.c_sub:\n",
    "    selected_classes = np.delete(selected_classes, args.target_class)\n",
    "    selected_classes = np.random.choice(selected_classes, args.c_sub-1, replace=False)\n",
    "    selected_classes = np.append(selected_classes, args.target_class)\n",
    "\n",
    "# keep the same transforms for train and test dataset for better visualization\n",
    "result_attack[\"clean_train\"].wrap_img_transform = result_attack[\"clean_test\"].wrap_img_transform \n",
    "result_attack[\"bd_train\"].wrap_img_transform = result_attack[\"bd_test\"].wrap_img_transform \n",
    " \n",
    "args.visual_dataset = 'bd_train'\n",
    "# Create dataset. Only support BD_TEST and BD_TRAIN\n",
    "if args.visual_dataset == 'bd_train':  \n",
    "    bd_train_with_trans = result_attack[\"bd_train\"]\n",
    "    visual_dataset = generate_bd_dataset(bd_train_with_trans, args.target_class, selected_classes, max_num_samples=args.n_sub, bd_only = True)\n",
    "elif args.visual_dataset == 'bd_test':\n",
    "    bd_test_with_trans = result_attack[\"bd_test\"]\n",
    "    visual_dataset = generate_bd_dataset(bd_test_with_trans, args.target_class, selected_classes, max_num_samples=args.n_sub, bd_only = True)\n",
    "else:\n",
    "    assert False, \"Illegal vis_class\"\n",
    "\n",
    "print(f'Create visualization dataset with \\n \\t Dataset: {args.visual_dataset} \\n \\t Number of samples: {len(visual_dataset)}  \\n \\t Selected classes: {selected_classes}')\n",
    "\n",
    "# Create data loader\n",
    "data_loader = torch.utils.data.DataLoader(\n",
    "    visual_dataset, batch_size=args.batch_size, num_workers=args.num_workers, shuffle=False\n",
    ")\n",
    "\n",
    "# Create denormalization function\n",
    "for trans_t in data_loader.dataset.wrap_img_transform.transforms:\n",
    "    if isinstance(trans_t, transforms.Normalize):\n",
    "        denormalizer = get_dataset_denormalization(trans_t)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e3f652e5",
   "metadata": {},
   "source": [
    "### Step 3: Load Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "ff67e7b8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Load model preactresnet18 from badnet_demo\n"
     ]
    }
   ],
   "source": [
    "# Load model\n",
    "model_visual = generate_cls_model(args.model, args.num_classes)\n",
    "model_visual.load_state_dict(result_attack[\"model\"])\n",
    "model_visual.to(args.device)\n",
    "# !!! Important to set eval mode !!!\n",
    "model_visual.eval()\n",
    "print(f\"Load model {args.model} from {args.result_file_attack}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc952077",
   "metadata": {},
   "source": [
    "### Step 4: Plot Neuron Activation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "94612903",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Plotting T-SNE\n",
      "Choose layer layer4.1.conv2 from model preactresnet18\n"
     ]
    }
   ],
   "source": [
    "############## Neuron Activation ##################\n",
    "print(\"Plotting Neuron Activation\")\n",
    "\n",
    "# Choose layer for feature extraction\n",
    "module_dict = dict(model_visual.named_modules())\n",
    "target_layer = module_dict[args.target_layer_name]\n",
    "print(f'Choose layer {args.target_layer_name} from model {args.model}')\n",
    "\n",
    "# Get BD features\n",
    "features_bd, labels_bd, other_info = get_features(args, model_visual, target_layer, data_loader)\n",
    "features_bd_avg = np.mean(features_bd, axis=0)\n",
    "\n",
    "# Get Corresponding Clean features\n",
    "visual_dataset.wrapped_dataset.poison_indicator = np.zeros_like(visual_dataset.wrapped_dataset.poison_indicator)\n",
    "\n",
    "features_clean, labels_clean, other_info = get_features(args, model_visual, target_layer, data_loader)\n",
    "features_clean_avg = np.mean(features_clean, axis=0)\n",
    "\n",
    "sort_bar = np.argsort(features_clean_avg)[::-1]\n",
    "\n",
    "features_bd_avg = features_bd_avg[sort_bar]\n",
    "features_clean_avg = features_clean_avg[sort_bar]\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "f65bfe12",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f0039a483d0>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 10))\n",
    "plt.bar(\n",
    "    np.arange(features_clean_avg.shape[0]),\n",
    "    features_clean_avg,\n",
    "    label=\"Clean\",\n",
    "    alpha=0.7,\n",
    "    color=\"#2196F3\",\n",
    ")\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5a836820",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f00113d6280>"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlIAAAI/CAYAAAC8tTf3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAcM0lEQVR4nO3dfaxkZ2Hf8d8Tr8PihJfUXqUtC3ilGBbX76xiryxTCUPiBGRTCyMQ77hYQjElJYJCLRm0tRFVK9JWpbFWITWtLGNeFVPeSUERyHGza4yNbTBrgvEiKMuadzCwzdM/7qxzvdy7e+9zz8ycc+bzkazdmTn3nOfM2bnz9XPOnVtqrQEAYP1+bd4DAAAYKiEFANBISAEANBJSAACNhBQAQCMhBQDQaNM8NnrSSSfVk08+eR6bBgBYl71793631rplpcfmElInn3xy9uzZM49NAwCsSynl/tUec2oPAKCRkAIAaCSkAAAazeUaKQCge7/85S+zf//+PPTQQ/MeyiBt3rw5W7duzfHHH7/mrxFSADAS+/fvz2Me85icfPLJKaXMeziDUmvNwYMHs3///mzbtm3NX+fUHgCMxEMPPZQTTzxRRDUopeTEE09c92yekAKAERFR7VqeOyEFAHTmuOOOy1lnnZXTTjstl112WX7605+uuuzNN9+ct7/97TMc3ZLPfvazee5zn9vJulwjBQAjteuWaztd39U7rzrmMo9+9KNz++23J0le/OIX57rrrsvrX//6FZe9+OKLc/HFF3c5xJkzIwUATMUFF1yQffv25cEHH8zznve8nHHGGTnvvPNyxx13JEmuv/76XHnllUmS973vfTnttNNy5pln5hnPeEaSpWu+XvnKV+b000/P2Wefnc985jMPf92ll16aiy66KKecckre+MY3PrzNT37yk9m5c2fOOeecXHbZZfnxj3+cJPn4xz+e7du355xzzskHP/jBzvZRSAEAnTt06FA+9rGP5fTTT89b3vKWnH322bnjjjvytre9LS972ct+Zfldu3blE5/4RL74xS/m5ptvTpK8853vTCkld955Z2688ca8/OUvf/hi8Ntvvz033XRT7rzzztx000154IEH8t3vfjfXXHNNPv3pT+e2227Ljh078o53vCMPPfRQXv3qV+fDH/5w9u7dm29/+9ud7adTewBAZ372s5/lrLPOSrI0I3X5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",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(10, 10))\n",
    "plt.bar(\n",
    "    np.arange(features_bd_avg.shape[0]),\n",
    "    features_bd_avg,\n",
    "    label=\"Poisoned\",\n",
    "    alpha=0.7,\n",
    "    color=\"#4CAF50\",\n",
    ")\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "f4d5002e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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99AAJkmSDF9TMJm2M4BJkiQV5hwwSZK0hv3PWtXW4319z5kt7Xfrrbdy4IEHcvHFF7PhhhvytKc9jaOOOoq9996b5cuXt7WmuhnAJElS7TKT17/+9ey7775873vfA+Cyyy7jD3/4Q82VdYZDkJIkqXZLlixh+vTpvOc971m9bf78+Wy22WarHz/22GMcdNBB7Ljjjmy77bYce+yxANx///3stttuLFiwgHnz5vHDH/4QgBUrVrD11lvz7ne/m2222YZXvOIVrFrV3t69yTKASZKk2i1fvpwddthhzH2+8Y1vsMEGG3DxxRdz8cUX87WvfY3f/OY3zJgxg9NOO41LLrmEJUuW8JGPfITMBOD666/nfe97H1deeSUbbrghp5xySomPMy6HICVJUk8499xzufzyyzn55JMBuOeee7j++uuZPXs2n/jEJ/j5z3/Ok570JG655ZbVQ5dz585lu+22A2CHHXZgxYoVNVW/JgOYJEmq3TbbbLM6WI0mM/nKV77C7rvvvsb24447jttvv51ly5Yxffp05syZs3pdrnXWWWf1ftOmTXMIUpIkacjLXvYyHnroIRYvXrx62+WXX87NN9+8+vHuu+/OV7/6VR555BEArrvuOh544AHuueceNt10U6ZPn86SJUu46aabitc/UfaASZKkNbS6bEQ7RQSnnXYaBx54IJ/97GeZMWMGc+bM4aijjlq9z/7778+KFStYsGABmcmsWbM4/fTTeetb38pee+3FvHnzWLhwIVtttVXx+icqhiap9YKFCxfm0qVL6y5DkqS+cvXVV7P11lvXXUZPG6kNI2JZZi4caX+HICVJkgozgEmSJBVmAJMkSSrMACZJklSYAUySJKkwA5gkSVJhrgMmSZLWcMSFn2nr8Q5bdOi4+0ybNo158+bx6KOPsvXWW3P88cez7rrrjrjvGWecwVVXXcXBBx/c1jrH89Of/pQjjzySH//4x1M+lj1gkiSpdjNnzuTSSy9l+fLlrL322hxzzDGj7vua17ymePhqNwOYJEnqKrvuuis33HADd955J6973evYdttt2Xnnnbn88suBxrUf3//+9wPwgx/8gOc///nMnz+fF7/4xQA8+OCDvOMd72DevHlsv/32LFmyZPXr9t57b/bYYw+22GILPvaxj61+z3PPPZdFixaxYMEC3vSmN3H//fcDcPbZZ7PVVluxYMECTj311LZ9RgOYJEnqGo8++ig/+clPmDdvHp/85CfZfvvtufzyy/mXf/kX3v72tz9h/yOOOIJzzjmHyy67jDPOOAOAo48+mojgiiuu4MQTT2TfffddfXHuSy+9lJNOOokrrriCk046iZtvvpk//vGPfPrTn+b888/nkksuYeHChXzxi1/kwQcf5N3vfjc/+tGPWLZsGbfeemvbPqdzwCRJUu1WrVrFdtttBzR6wN71rnex0047ccoppwCNi3Xfcccd3HvvvWu8bpdddmG//fbjzW9+M3vvvTcAF1xwAR/4wAcA2Gqrrdh888257rrrANhtt93YYIMNAHje857HTTfdxN13381VV13FLrvsAsDDDz/MokWLuOaaa5g7dy5bbLEFAG9729vWuFj4VBjAJElS7YbmgE3UMcccw0UXXcSZZ57JDjvswLJly8bcf5111ll9f9q0aTz66KNkJn/1V3/FiSeeuMa+k6mnVQ5BSpKkrrTrrrtywgknAI0zEDfZZBPWX3/9Nfa58cYb2WmnnTjiiCOYNWsWN9988xqvu+666/jtb3/LlltuOer77Lzzzvzyl7/khhtuAOCBBx7guuuuY6uttmLFihXceOONAE8IaFNhD5gkSVpDK8tGlHD44Yfzzne+k2233ZZ1112X448//gn7HHTQQVx//fVkJrvtthvz589nq6224u///u+ZN28ea621Fscdd9waPV/DzZo1i+OOO4599tmHhx56CIBPf/rTPPe5z2Xx4sW86lWvYt1112XXXXflvvvua8tni8xsy4FKWLhwYS5durTuMiRJ6itXX301W2+9dd1l9LSR2jAilmXmwpH2dwhSkiSpMAOYJElSYQYwSZJEL01J6jaTaTsDmCRJA27GjBnccccdhrBJyEzuuOMOZsyYMaHXeRakJEkDbvbs2axcuZLbb7+97lJ60owZM5g9e/aEXmMAkyRpwE2fPp25c+fWXcZAcQhSkiSpMAOYJElSYQYwSZKkwgxgkiRJhdUWwCJis4hYEhFXRcSVEfEPddUiSZJUUp1nQT4KfCQzL4mI9YBlEXFeZl5VY02SJEkdV1sPWGb+PjMvqe7fB1wNPLOueiRJkkrpijlgETEH2B64aITnDoiIpRGx1AXiJElSP6g9gEXEU4BTgAMz897hz2fm4sxcmJkLZ82aVb5ASZKkNqs1gEXEdBrh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",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "plt.figure(figsize=(10, 10))\n",
    "plt.bar(\n",
    "    np.arange(features_clean_avg.shape[0]),\n",
    "    features_clean_avg,\n",
    "    label=\"Clean\",\n",
    "    alpha=0.7,\n",
    "    color=\"#2196F3\",\n",
    ")\n",
    "plt.bar(\n",
    "    np.arange(features_bd_avg.shape[0]),\n",
    "    features_bd_avg,\n",
    "    label=\"Poisoned\",\n",
    "    alpha=0.7,\n",
    "    color=\"#4CAF50\",\n",
    ")\n",
    "plt.xlabel(\"Neuron\")\n",
    "plt.ylabel(\"Average Activation Value\")\n",
    "plt.title(f\"{get_dataname(args.dataset)}, {get_pratio(args.pratio)}% Poisoned Samples\")\n",
    "plt.xlim(0, features_clean_avg.shape[0])\n",
    "plt.legend()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.8.10 (default, Nov 14 2022, 12:59:47) \n[GCC 9.4.0]"
  },
  "vscode": {
   "interpreter": {
    "hash": "31f2aee4e71d21fbe5cf8b01ff0e069b9275f58929596ceb00d14d90e3e16cd6"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
